package demo.database.mssql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.titan.core.utils.data.FormatUtils;
import com.titan.core.utils.data.RandomUtils;
import com.titan.core.utils.db.DBUtils;
import com.titan.core.utils.db.RecordSet;
import com.titan.core.utils.file.FileUtils;

/**
 *
 *
 * @author 周成功
 * 
 */
public class MssqlToMysql {
    public static void main(String[] args) {
        Connection connForm = null;
        Connection connTo = null;
        try {
            connForm = DBUtils.getMSSQLConnection("192.168.128.213", "1433", "H20170913", "sa", "123456", true);
            connTo = DBUtils.getMySQLConnection("127.0.0.1", "3306", "member", "root", "123456", true);
            
//            run(connForm, connTo, "member");          // 27170  排除 userID=17773319697
//            run(connForm, connTo, "Actions");         // 权限表   61
//            run(connForm, connTo, "Areas");           // 地区表   3527
//            run(connForm, connTo, "catJS");           // 57
//            run(connForm, connTo, "County");          // 大区表   3384
//            run(connForm, connTo, "currency");          // 1806868
//            run(connForm, connTo, "FuTou");           // 复消表  387422
//            run(connForm, connTo, "LockRec");         // 冻结表   190
//            run(connForm, connTo, "MoneyDetails");    // 资金变动情况表  3282838
//            run(connForm, connTo, "msg");             // 会员申请表    1160
//            run(connForm, connTo, "mTransfer");       // 转账表  58
//            run(connForm, connTo, "news");            // 系统通知表    11
//            run(connForm, connTo, "order");           // 采购订单主表（买赞）   41289
//            run(connForm, connTo, "Orderdetails");    // 采购订单从表       41289
//            run(connForm, connTo, "Product");         // 产品表      10
//            run(connForm, connTo, "remittance");      // 26591
//            run(connForm, connTo, "sysLog");          // 系统访问日志   2052001
//            run(connForm, connTo, "sysParameter");    // 1
//            run(connForm, connTo, "sysParameter3M");  // 1
//            run(connForm, connTo, "sysQQ");           // 1
//            run(connForm, connTo, "sysSetting");      // 系统参数表    1
//            run(connForm, connTo, "takeCash");        // 106674
//            run(connForm, connTo, "TakeCash2");       // 6
//            run(connForm, connTo, "upgrade2");        // 提现表   134
            
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            DBUtils.close(connForm);
            DBUtils.close(connTo);
        }
    }    
    private static void run(Connection connForm, Connection connTo, String tablename) throws Exception {
        DBUtils.execute(connTo, "truncate table `" + tablename + "`");
        String sql = "select * from [" + tablename + "]";
        Statement stmtForm = null;
        ResultSet restForm = null;
        PreparedStatement stmtTo = null;
        try {
            stmtForm = connForm.createStatement();
            restForm = stmtForm.executeQuery(sql);
            
            boolean hasId = false;
            List<String> fields = new ArrayList<String>();
            List<Integer> fieldsType = new ArrayList<Integer>();
            ResultSetMetaData metas = restForm.getMetaData();
            for (int i = 1; i <= metas.getColumnCount(); i++) {
//                if(i>max)  break;
                String field = metas.getColumnName(i);
//                if("reName".equalsIgnoreCase(field)) continue;
                fields.add(field);
                if("id".equalsIgnoreCase(field)) {
                    hasId = true;
                }
                int type = metas.getColumnType(i);
                if(type==-9) {  // -9表示NVARCHAR    -1表示LONGVARCHAR
                    fieldsType.add(-1);
                } else {
                    fieldsType.add(type);
                }
            }            
            
            StringBuffer insert = new StringBuffer(1024);
            StringBuffer insert_value = new StringBuffer(1024);
            insert.append("INSERT INTO `").append(tablename).append("`");
            insert_value.append(") VALUES ");
            for (int i = 0; i < fields.size(); i++) {
                if( i==0 ) {
                    insert.append("(");
                    insert_value.append("(");
                } else {
                    insert.append(",");
                    insert_value.append(",");
                }
                String field = fields.get(i);
                if("class".equalsIgnoreCase(field)) {
                    insert.append("`clazz`");
                } else {
                    insert.append("`").append(field).append("`");
                }
                insert_value.append("?");
            }
            if(hasId) {
                insert.append(",`create_name`,`create_dt`,`update_name`,`update_dt`,`delete_flag`");
                insert_value.append(",'sys',sysdate(),'sys',sysdate(),'0'");
            } else {
                insert.append(",`create_name`,`create_dt`,`update_name`,`update_dt`,`delete_flag`,`id`");
                insert_value.append(",'sys',sysdate(),'sys',sysdate(),'0',?");
            }
            insert.append(insert_value).append(")");            
            
            System.out.println(insert);
            
            stmtTo = connTo.prepareStatement(insert.toString());
            while(restForm.next()) {
                for (int i = 1; i <= fields.size(); i++) {
                    String field = fields.get(i-1);
                    int type = fieldsType.get(i-1);
                    Object value = restForm.getObject(field);
//                    if("reName".equalsIgnoreCase(field)) {
//                        System.out.println("["+FormatUtils.to3Digit(i)+"] "+field+"="+value);
//                    }
                    try {
//                        System.out.println("["+FormatUtils.to3Digit(i)+"] "+field+"="+value);
//                        if(value==null) {
//                            stmtTo.setNull(i, type);
//                        } else if("java.sql.Timestamp".equals(value.getClass().getName())) {
//                            stmtTo.setTimestamp(i, (java.sql.Timestamp)value);
//                        } else if("java.lang.String".equals(value.getClass().getName())) {
//                            stmtTo.setString(i, FormatUtils.toString(value));
//                        } else {
                            stmtTo.setObject(i, value, type);
//                        }
                    } catch (Exception e) {
                        System.out.println(field + "("+type+")=("+value.getClass().getName()+")" + value);
                        throw e;
                    }
                }
                if(hasId==false) {
                    stmtTo.setString(fields.size()+1, RandomUtils.uuid());
                }
                try {
                    stmtTo.executeUpdate();
                } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException e) {
                    if(e.getMessage().startsWith("Duplicate entry ")) {
                        System.out.println(e.getMessage());
                    } else {
                        throw e;
                    }
                }
            }
        } finally {
            DBUtils.close(stmtTo);
            DBUtils.close(restForm);
            DBUtils.close(stmtForm);
        }        
    }     
}

